
<!DOCTYPE HTML>
<html lang="zh-hans" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>15.2 生成文件并编写平台检查 · 《CMake Cookbook》中文版</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        <meta name="author" content="陈晓伟 chenxiaowei">
        
        
    
    <link rel="stylesheet" href="../../gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-pro/search.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-pageview-count/plugin.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
                
            
        

    

    
        
    
        
    
        
    
        
    
        
    
        
    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="15.3-chinese.html" />
    
    
    <link rel="prev" href="15.1-chinese.html" />
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="输入并搜索" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="../../">
            
                <a href="../../">
            
                    
                    Introduction
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="../preface/preface-chinese.html">
            
                <a href="../preface/preface-chinese.html">
            
                    
                    前言
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="../chapter0/0.0-chinese.html">
            
                <a href="../chapter0/0.0-chinese.html">
            
                    
                    第0章 配置环境
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.3.1" data-path="../chapter0/0.1-chinese.html">
            
                <a href="../chapter0/0.1-chinese.html">
            
                    
                    0.1 获取代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.2" data-path="../chapter0/0.2-chinese.html">
            
                <a href="../chapter0/0.2-chinese.html">
            
                    
                    0.2 Docker镜像
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.3" data-path="../chapter0/0.3-chinese.html">
            
                <a href="../chapter0/0.3-chinese.html">
            
                    
                    0.3 安装必要的软件
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.4" data-path="../chapter0/0.4-chinese.html">
            
                <a href="../chapter0/0.4-chinese.html">
            
                    
                    0.4 测试环境
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.5" data-path="../chapter0/0.5-chinese.html">
            
                <a href="../chapter0/0.5-chinese.html">
            
                    
                    0.5 上报问题并提出改进建议
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="../chapter1/1.0-chinese.html">
            
                <a href="../chapter1/1.0-chinese.html">
            
                    
                    第1章 从可执行文件到库
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.4.1" data-path="../chapter1/1.1-chinese.html">
            
                <a href="../chapter1/1.1-chinese.html">
            
                    
                    1.1 将单个源文件编译为可执行文件
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.2" data-path="../chapter1/1.2-chinese.html">
            
                <a href="../chapter1/1.2-chinese.html">
            
                    
                    1.2 切换生成器
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.3" data-path="../chapter1/1.3-chinese.html">
            
                <a href="../chapter1/1.3-chinese.html">
            
                    
                    1.3 构建和链接静态库和动态库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.4" data-path="../chapter1/1.4-chinese.html">
            
                <a href="../chapter1/1.4-chinese.html">
            
                    
                    1.4 用条件句控制编译
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.5" data-path="../chapter1/1.5-chinese.html">
            
                <a href="../chapter1/1.5-chinese.html">
            
                    
                    1.5 向用户显示选项
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.6" data-path="../chapter1/1.6-chinese.html">
            
                <a href="../chapter1/1.6-chinese.html">
            
                    
                    1.6 指定编译器
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.7" data-path="../chapter1/1.7-chinese.html">
            
                <a href="../chapter1/1.7-chinese.html">
            
                    
                    1.7 切换构建类型
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.8" data-path="../chapter1/1.8-chinese.html">
            
                <a href="../chapter1/1.8-chinese.html">
            
                    
                    1.8 设置编译器选项
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.9" data-path="../chapter1/1.9-chinese.html">
            
                <a href="../chapter1/1.9-chinese.html">
            
                    
                    1.9 为语言设定标准
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.10" data-path="../chapter1/1.10-chinese.html">
            
                <a href="../chapter1/1.10-chinese.html">
            
                    
                    1.10 使用控制流
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.5" data-path="../chapter2/2.0-chinese.html">
            
                <a href="../chapter2/2.0-chinese.html">
            
                    
                    第2章 检测环境
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.5.1" data-path="../chapter2/2.1-chinese.html">
            
                <a href="../chapter2/2.1-chinese.html">
            
                    
                    2.1 检测操作系统
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.2" data-path="../chapter2/2.2-chinese.html">
            
                <a href="../chapter2/2.2-chinese.html">
            
                    
                    2.2 处理与平台相关的源代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.3" data-path="../chapter2/2.3-chinese.html">
            
                <a href="../chapter2/2.3-chinese.html">
            
                    
                    2.3 处理与编译器相关的源代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.4" data-path="../chapter2/2.4-chinese.html">
            
                <a href="../chapter2/2.4-chinese.html">
            
                    
                    2.4 检测处理器体系结构
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.5" data-path="../chapter2/2.5-chinese.html">
            
                <a href="../chapter2/2.5-chinese.html">
            
                    
                    2.5 检测处理器指令集
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.6" data-path="../chapter2/2.6-chinese.html">
            
                <a href="../chapter2/2.6-chinese.html">
            
                    
                    2.6 为Eigen库使能向量化
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.6" data-path="../chapter3/3.0-chinese.html">
            
                <a href="../chapter3/3.0-chinese.html">
            
                    
                    第3章 检测外部库和程序
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.6.1" data-path="../chapter3/3.1-chinese.html">
            
                <a href="../chapter3/3.1-chinese.html">
            
                    
                    3.1 检测Python解释器
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.2" data-path="../chapter3/3.2-chinese.html">
            
                <a href="../chapter3/3.2-chinese.html">
            
                    
                    3.2 检测Python库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.3" data-path="../chapter3/3.3-chinese.html">
            
                <a href="../chapter3/3.3-chinese.html">
            
                    
                    3.3 检测Python模块和包
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.4" data-path="../chapter3/3.4-chinese.html">
            
                <a href="../chapter3/3.4-chinese.html">
            
                    
                    3.4 检测BLAS和LAPACK数学库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.5" data-path="../chapter3/3.5-chinese.html">
            
                <a href="../chapter3/3.5-chinese.html">
            
                    
                    3.5 检测OpenMP的并行环境
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.6" data-path="../chapter3/3.6-chinese.html">
            
                <a href="../chapter3/3.6-chinese.html">
            
                    
                    3.6 检测MPI的并行环境
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.7" data-path="../chapter3/3.7-chinese.html">
            
                <a href="../chapter3/3.7-chinese.html">
            
                    
                    3.7 检测Eigen库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.8" data-path="../chapter3/3.8-chinese.html">
            
                <a href="../chapter3/3.8-chinese.html">
            
                    
                    3.8 检测Boost库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.9" data-path="../chapter3/3.9-chinese.html">
            
                <a href="../chapter3/3.9-chinese.html">
            
                    
                    3.9 检测外部库:Ⅰ. 使用pkg-config
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.10" data-path="../chapter3/3.10-chinese.html">
            
                <a href="../chapter3/3.10-chinese.html">
            
                    
                    3.10 检测外部库:Ⅱ. 自定义find模块
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.7" data-path="../chapter4/4.0-chinese.html">
            
                <a href="../chapter4/4.0-chinese.html">
            
                    
                    第4章 创建和运行测试
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.7.1" data-path="../chapter4/4.1-chinese.html">
            
                <a href="../chapter4/4.1-chinese.html">
            
                    
                    4.1 创建一个简单的单元测试
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.2" data-path="../chapter4/4.2-chinese.html">
            
                <a href="../chapter4/4.2-chinese.html">
            
                    
                    4.2 使用Catch2库进行单元测试
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.3" data-path="../chapter4/4.3-chinese.html">
            
                <a href="../chapter4/4.3-chinese.html">
            
                    
                    4.3 使用Google Test库进行单元测试
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.4" data-path="../chapter4/4.4-chinese.html">
            
                <a href="../chapter4/4.4-chinese.html">
            
                    
                    4.4 使用Boost Test进行单元测试
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.5" data-path="../chapter4/4.5-chinese.html">
            
                <a href="../chapter4/4.5-chinese.html">
            
                    
                    4.5 使用动态分析来检测内存缺陷
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.6" data-path="../chapter4/4.6-chinese.html">
            
                <a href="../chapter4/4.6-chinese.html">
            
                    
                    4.6 预期测试失败
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.7" data-path="../chapter4/4.7-chinese.html">
            
                <a href="../chapter4/4.7-chinese.html">
            
                    
                    4.7 使用超时测试运行时间过长的测试
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.8" data-path="../chapter4/4.8-chinese.html">
            
                <a href="../chapter4/4.8-chinese.html">
            
                    
                    4.8 并行测试
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.9" data-path="../chapter4/4.9-chinese.html">
            
                <a href="../chapter4/4.9-chinese.html">
            
                    
                    4.9 运行测试子集
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.10" data-path="../chapter4/4.10-chinese.html">
            
                <a href="../chapter4/4.10-chinese.html">
            
                    
                    4.10 使用测试固件
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.8" data-path="../chapter5/5.0-chinese.html">
            
                <a href="../chapter5/5.0-chinese.html">
            
                    
                    第5章 配置时和构建时的操作
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.8.1" data-path="../chapter5/5.1-chinese.html">
            
                <a href="../chapter5/5.1-chinese.html">
            
                    
                    5.1 使用平台无关的文件操作
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.2" data-path="../chapter5/5.2-chinese.html">
            
                <a href="../chapter5/5.2-chinese.html">
            
                    
                    5.2 配置时运行自定义命令
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.3" data-path="../chapter5/5.3-chinese.html">
            
                <a href="../chapter5/5.3-chinese.html">
            
                    
                    5.3 构建时运行自定义命令:Ⅰ. 使用add_custom_command
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.4" data-path="../chapter5/5.4-chinese.html">
            
                <a href="../chapter5/5.4-chinese.html">
            
                    
                    5.4 构建时运行自定义命令:Ⅱ. 使用add_custom_target
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.5" data-path="../chapter5/5.5-chinese.html">
            
                <a href="../chapter5/5.5-chinese.html">
            
                    
                    5.5 构建时为特定目标运行自定义命令
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.6" data-path="../chapter5/5.6-chinese.html">
            
                <a href="../chapter5/5.6-chinese.html">
            
                    
                    5.6 探究编译和链接命令
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.7" data-path="../chapter5/5.7-chinese.html">
            
                <a href="../chapter5/5.7-chinese.html">
            
                    
                    5.7 探究编译器标志命令
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.8" data-path="../chapter5/5.8-chinese.html">
            
                <a href="../chapter5/5.8-chinese.html">
            
                    
                    5.8 探究可执行命令
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8.9" data-path="../chapter5/5.9-chinese.html">
            
                <a href="../chapter5/5.9-chinese.html">
            
                    
                    5.9 使用生成器表达式微调配置和编译
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.9" data-path="../chapter6/6.0-chinese.html">
            
                <a href="../chapter6/6.0-chinese.html">
            
                    
                    第6章 生成源码
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.9.1" data-path="../chapter6/6.1-chinese.html">
            
                <a href="../chapter6/6.1-chinese.html">
            
                    
                    6.1 配置时生成源码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.2" data-path="../chapter6/6.2-chinese.html">
            
                <a href="../chapter6/6.2-chinese.html">
            
                    
                    6.2 使用Python在配置时生成源码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.3" data-path="../chapter6/6.3-chinese.html">
            
                <a href="../chapter6/6.3-chinese.html">
            
                    
                    6.3 构建时使用Python生成源码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.4" data-path="../chapter6/6.4-chinese.html">
            
                <a href="../chapter6/6.4-chinese.html">
            
                    
                    6.4 记录项目版本信息以便报告
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.5" data-path="../chapter6/6.5-chinese.html">
            
                <a href="../chapter6/6.5-chinese.html">
            
                    
                    6.5 从文件中记录项目版本
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.6" data-path="../chapter6/6.6-chinese.html">
            
                <a href="../chapter6/6.6-chinese.html">
            
                    
                    6.6 配置时记录Git Hash值
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9.7" data-path="../chapter6/6.7-chinese.html">
            
                <a href="../chapter6/6.7-chinese.html">
            
                    
                    6.7 构建时记录Git Hash值
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.10" data-path="../chapter7/7.0-chinese.html">
            
                <a href="../chapter7/7.0-chinese.html">
            
                    
                    第7章 构建项目
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.10.1" data-path="../chapter7/7.1-chinese.html">
            
                <a href="../chapter7/7.1-chinese.html">
            
                    
                    7.1 使用函数和宏重用代码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.2" data-path="../chapter7/7.2-chinese.html">
            
                <a href="../chapter7/7.2-chinese.html">
            
                    
                    7.2 将CMake源代码分成模块
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.3" data-path="../chapter7/7.3-chinese.html">
            
                <a href="../chapter7/7.3-chinese.html">
            
                    
                    7.3 编写函数来测试和设置编译器标志
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.4" data-path="../chapter7/7.4-chinese.html">
            
                <a href="../chapter7/7.4-chinese.html">
            
                    
                    7.4 用指定参数定义函数或宏
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.5" data-path="../chapter7/7.5-chinese.html">
            
                <a href="../chapter7/7.5-chinese.html">
            
                    
                    7.5 重新定义函数和宏
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.6" data-path="../chapter7/7.6-chinese.html">
            
                <a href="../chapter7/7.6-chinese.html">
            
                    
                    7.6 使用废弃函数、宏和变量
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.7" data-path="../chapter7/7.7-chinese.html">
            
                <a href="../chapter7/7.7-chinese.html">
            
                    
                    7.7 add_subdirectory的限定范围
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.8" data-path="../chapter7/7.8-chinese.html">
            
                <a href="../chapter7/7.8-chinese.html">
            
                    
                    7.8 使用target_sources避免全局变量
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.10.9" data-path="../chapter7/7.9-chinese.html">
            
                <a href="../chapter7/7.9-chinese.html">
            
                    
                    7.9 组织Fortran项目
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.11" data-path="../chapter8/8.0-chinese.html">
            
                <a href="../chapter8/8.0-chinese.html">
            
                    
                    第8章 超级构建模式
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.11.1" data-path="../chapter8/8.1-chinese.html">
            
                <a href="../chapter8/8.1-chinese.html">
            
                    
                    8.1 使用超级构建模式
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.2" data-path="../chapter8/8.2-chinese.html">
            
                <a href="../chapter8/8.2-chinese.html">
            
                    
                    8.2 使用超级构建管理依赖项:Ⅰ.Boost库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.3" data-path="../chapter8/8.3-chinese.html">
            
                <a href="../chapter8/8.3-chinese.html">
            
                    
                    8.3 使用超级构建管理依赖项:Ⅱ.FFTW库
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.4" data-path="../chapter8/8.4-chinese.html">
            
                <a href="../chapter8/8.4-chinese.html">
            
                    
                    8.4 使用超级构建管理依赖项:Ⅲ.Google Test框架
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11.5" data-path="../chapter8/8.5-chinese.html">
            
                <a href="../chapter8/8.5-chinese.html">
            
                    
                    8.5 使用超级构建支持项目
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.12" data-path="../chapter9/9.0-chinese.html">
            
                <a href="../chapter9/9.0-chinese.html">
            
                    
                    第9章 语言混合项目
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.12.1" data-path="../chapter9/9.1-chinese.html">
            
                <a href="../chapter9/9.1-chinese.html">
            
                    
                    9.1 使用C/C++库构建Fortran项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.2" data-path="../chapter9/9.2-chinese.html">
            
                <a href="../chapter9/9.2-chinese.html">
            
                    
                    9.2 使用Fortran库构建C/C++项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.3" data-path="../chapter9/9.3-chinese.html">
            
                <a href="../chapter9/9.3-chinese.html">
            
                    
                    9.3 使用Cython构建C++和Python项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.4" data-path="../chapter9/9.4-chinese.html">
            
                <a href="../chapter9/9.4-chinese.html">
            
                    
                    9.4 使用Boost.Python构建C++和Python项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.5" data-path="../chapter9/9.5-chinese.html">
            
                <a href="../chapter9/9.5-chinese.html">
            
                    
                    9.5 使用pybind11构建C++和Python项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12.6" data-path="../chapter9/9.6-chinese.html">
            
                <a href="../chapter9/9.6-chinese.html">
            
                    
                    9.6 使用Python CFFI混合C，C++，Fortran和Python
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.13" data-path="../chapter10/10.0-chinese.html">
            
                <a href="../chapter10/10.0-chinese.html">
            
                    
                    第10章 编写安装程序
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.13.1" data-path="../chapter10/10.1-chinese.html">
            
                <a href="../chapter10/10.1-chinese.html">
            
                    
                    10.1 安装项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.13.2" data-path="../chapter10/10.2-chinese.html">
            
                <a href="../chapter10/10.2-chinese.html">
            
                    
                    10.2 生成输出头文件
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.13.3" data-path="../chapter10/10.3-chinese.html">
            
                <a href="../chapter10/10.3-chinese.html">
            
                    
                    10.3 输出目标
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.13.4" data-path="../chapter10/10.4-chinese.html">
            
                <a href="../chapter10/10.4-chinese.html">
            
                    
                    10.4 安装超级构建
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.14" data-path="../chapter11/11.0-chinese.html">
            
                <a href="../chapter11/11.0-chinese.html">
            
                    
                    第11章 打包项目
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.14.1" data-path="../chapter11/11.1-chinese.html">
            
                <a href="../chapter11/11.1-chinese.html">
            
                    
                    11.1 生成源代码和二进制包
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.14.2" data-path="../chapter11/11.2-chinese.html">
            
                <a href="../chapter11/11.2-chinese.html">
            
                    
                    11.2 通过PyPI发布使用CMake/pybind11构建的C++/Python项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.14.3" data-path="../chapter11/11.3-chinese.html">
            
                <a href="../chapter11/11.3-chinese.html">
            
                    
                    11.3 通过PyPI发布使用CMake/CFFI构建C/Fortran/Python项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.14.4" data-path="../chapter11/11.4-chinese.html">
            
                <a href="../chapter11/11.4-chinese.html">
            
                    
                    11.4 以Conda包的形式发布一个简单的项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.14.5" data-path="../chapter11/11.5-chinese.html">
            
                <a href="../chapter11/11.5-chinese.html">
            
                    
                    11.5 将Conda包作为依赖项发布给项目
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.15" data-path="../chapter12/12.0-chinese.html">
            
                <a href="../chapter12/12.0-chinese.html">
            
                    
                    第12章 构建文档
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.15.1" data-path="../chapter12/12.1-chinese.html">
            
                <a href="../chapter12/12.1-chinese.html">
            
                    
                    12.1 使用Doxygen构建文档
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.15.2" data-path="../chapter12/12.2-chinese.html">
            
                <a href="../chapter12/12.2-chinese.html">
            
                    
                    12.2 使用Sphinx构建文档
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.15.3" data-path="../chapter12/12.3-chinese.html">
            
                <a href="../chapter12/12.3-chinese.html">
            
                    
                    12.3 结合Doxygen和Sphinx
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.16" data-path="../chapter13/13.0-chinese.html">
            
                <a href="../chapter13/13.0-chinese.html">
            
                    
                    第13章 选择生成器和交叉编译
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.16.1" data-path="../chapter13/13.1-chinese.html">
            
                <a href="../chapter13/13.1-chinese.html">
            
                    
                    13.1 使用CMake构建Visual Studio 2017项目
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.16.2" data-path="../chapter13/13.2-chinese.html">
            
                <a href="../chapter13/13.2-chinese.html">
            
                    
                    13.2 交叉编译hello world示例
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.16.3" data-path="../chapter13/13.3-chinese.html">
            
                <a href="../chapter13/13.3-chinese.html">
            
                    
                    13.3 使用OpenMP并行化交叉编译Windows二进制文件
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.17" data-path="../chapter14/14.0-chinese.html">
            
                <a href="../chapter14/14.0-chinese.html">
            
                    
                    第14章 测试面板
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.17.1" data-path="../chapter14/14.1-chinese.html">
            
                <a href="../chapter14/14.1-chinese.html">
            
                    
                    14.1 将测试部署到CDash
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.2" data-path="../chapter14/14.2-chinese.html">
            
                <a href="../chapter14/14.2-chinese.html">
            
                    
                    14.2 CDash显示测试覆盖率
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.3" data-path="../chapter14/14.3-chinese.html">
            
                <a href="../chapter14/14.3-chinese.html">
            
                    
                    14.3 使用AddressSanifier向CDash报告内存缺陷
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17.4" data-path="../chapter14/14.4-chinese.html">
            
                <a href="../chapter14/14.4-chinese.html">
            
                    
                    14.4 使用ThreadSaniiser向CDash报告数据争用
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.18" data-path="15.0-chinese.html">
            
                <a href="15.0-chinese.html">
            
                    
                    第15章 使用CMake构建已有项目
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.18.1" data-path="15.1-chinese.html">
            
                <a href="15.1-chinese.html">
            
                    
                    15.1 如何开始迁移项目
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.18.2" data-path="15.2-chinese.html">
            
                <a href="15.2-chinese.html">
            
                    
                    15.2 生成文件并编写平台检查
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.18.3" data-path="15.3-chinese.html">
            
                <a href="15.3-chinese.html">
            
                    
                    15.3 检测所需的链接和依赖关系
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.18.4" data-path="15.4-chinese.html">
            
                <a href="15.4-chinese.html">
            
                    
                    15.4 复制编译标志
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.18.5" data-path="15.5-chinese.html">
            
                <a href="15.5-chinese.html">
            
                    
                    15.5 移植测试
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.18.6" data-path="15.6-chinese.html">
            
                <a href="15.6-chinese.html">
            
                    
                    15.6 移植安装目标
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.18.7" data-path="15.7-chinese.html">
            
                <a href="15.7-chinese.html">
            
                    
                    15.7 进一步迁移的措施
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.18.8" data-path="15.8-chinese.html">
            
                <a href="15.8-chinese.html">
            
                    
                    15.8 项目转换为CMake的常见问题
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.19" data-path="../chapter16/16.0-chinese.html">
            
                <a href="../chapter16/16.0-chinese.html">
            
                    
                    第16章 可能感兴趣的书
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.19.1" data-path="../chapter16/16.1-chinese.html">
            
                <a href="../chapter16/16.1-chinese.html">
            
                    
                    16.1 留下评论——让其他读者知道你的想法
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="http://www.bczl.xyz/" target="blank" class="gitbook-link">
            编程之路
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="../.." >15.2 生成文件并编写平台检查</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <h1 id="152-&#x751F;&#x6210;&#x6587;&#x4EF6;&#x5E76;&#x7F16;&#x5199;&#x5E73;&#x53F0;&#x68C0;&#x67E5;">15.2 &#x751F;&#x6210;&#x6587;&#x4EF6;&#x5E76;&#x7F16;&#x5199;&#x5E73;&#x53F0;&#x68C0;&#x67E5;</h1>
<p>&#x5BF9;&#x4E8E;Vim&#x793A;&#x4F8B;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5728;&#x914D;&#x7F6E;&#x65F6;&#x751F;&#x6210;&#x4E09;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;<code>src/auto/pathdef.c</code>&#x3001;<code>src/auto/config.h</code>&#x548C;<code>src/auto/osdef.h</code>:</p>
<ul>
<li>pathdef.c&#xFF1A;&#x8BB0;&#x5F55;&#x5B89;&#x88C5;&#x8DEF;&#x5F84;&#x3001;&#x7F16;&#x8BD1;/&#x94FE;&#x63A5;&#x6807;&#x5FD7;&#x3001;&#x5F53;&#x524D;&#x7528;&#x6237;&#x548C;&#x4E3B;&#x673A;&#x540D;</li>
<li>config.h&#xFF1A;&#x7F16;&#x8BD1;&#x7CFB;&#x7EDF;&#x7684;&#x73AF;&#x5883;</li>
<li>osdef.h&#xFF1A;&#x7531;<code>src/osdef.sh</code>&#x751F;&#x6210;&#x7684;&#x6587;&#x4EF6;</li>
</ul>
<p>&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x76F8;&#x5F53;&#x666E;&#x904D;&#x3002;&#x9700;&#x8981;CMake&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x914D;&#x7F6E;&#x65F6;&#x6267;&#x884C;&#x4E00;&#x4E2A;&#x811A;&#x672C;&#xFF0C;&#x6267;&#x884C;&#x8BB8;&#x591A;&#x5E73;&#x53F0;&#x68C0;&#x67E5;&#x547D;&#x4EE4;&#xFF0C;&#x6765;&#x751F;&#x6210;<code>config.h</code>&#x3002;&#x7279;&#x522B;&#x662F;&#xFF0C;&#x5BF9;&#x4E8E;&#x90A3;&#x4E9B;&#x53EF;&#x79FB;&#x690D;&#x7684;&#x9879;&#x76EE;&#xFF0C;&#x5E73;&#x53F0;&#x68C0;&#x67E5;&#x975E;&#x5E38;&#x666E;&#x904D;&#x3002;</p>
<p>&#x5728;&#x539F;&#x59CB;&#x76EE;&#x5F55;&#x6811;&#x4E2D;&#xFF0C;&#x6587;&#x4EF6;&#x5728;<code>src</code>&#x6587;&#x4EF6;&#x5939;&#x4E0B;&#x751F;&#x6210;&#x3002;&#x800C;&#x6211;&#x4EEC;&#x5C06;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x65B9;&#x6CD5;&#xFF1A;&#x8FD9;&#x4E9B;&#x6587;&#x4EF6;&#x4F1A;&#x751F;&#x6210;&#x5728;<code>build</code>&#x76EE;&#x5F55;&#x4E2D;&#x3002;&#x8FD9;&#x6837;&#x505A;&#x7684;&#x539F;&#x56E0;&#x662F;&#x751F;&#x6210;&#x7684;&#x6587;&#x4EF6;&#x901A;&#x5E38;&#x4F9D;&#x8D56;&#x4E8E;&#x6240;&#x9009;&#x62E9;&#x7684;&#x9009;&#x9879;&#x3001;&#x7F16;&#x8BD1;&#x5668;&#x6216;&#x6784;&#x5EFA;&#x7C7B;&#x578B;&#xFF0C;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x4FDD;&#x6301;&#x540C;&#x4E00;&#x4E2A;&#x6E90;&#xFF0C;&#x53EF;&#x4EE5;&#x9002;&#x914D;&#x591A;&#x4E2A;&#x6784;&#x5EFA;&#x3002;&#x8981;&#x5728;<code>build</code>&#x76EE;&#x5F55;&#x4E2D;&#x542F;&#x7528;&#x751F;&#x6210;&#xFF0C;&#x6211;&#x4EEC;&#x5FC5;&#x987B;&#x5BF9;&#x751F;&#x6210;&#x6587;&#x4EF6;&#x7684;&#x811A;&#x672C;&#x8FDB;&#x884C;&#x6539;&#x52A8;&#x3002;</p>
<h2 id="&#x6784;&#x9020;&#x6587;&#x4EF6;">&#x6784;&#x9020;&#x6587;&#x4EF6;</h2>
<p>&#x6211;&#x4EEC;&#x5C06;&#x628A;&#x4E0E;&#x751F;&#x6210;&#x6587;&#x4EF6;&#x76F8;&#x5173;&#x7684;&#x51FD;&#x6570;&#x96C6;&#x4E2D;&#x653E;&#x5728;<code>src/autogenerate.cmake</code>&#x4E2D;&#x3002;&#x5728;&#x5B9A;&#x4E49;&#x53EF;&#x6267;&#x884C;&#x76EE;&#x6807;&#x4E4B;&#x524D;&#xFF0C;&#x5728;<code>src/CMakeLists.txt</code>&#x4E2D;&#x8C03;&#x7528;&#x8FD9;&#x4E9B;&#x51FD;&#x6570;:</p>
<pre><code class="lang-cmake"><span class="hljs-comment"># generate config.h, pathdef.c, and osdef.h</span>
<span class="hljs-keyword">include</span>(autogenerate.cmake)
generate_config_h()
generate_pathdef_c()
generate_osdef_h()

<span class="hljs-keyword">add_executable</span>(vim
      main.c
  )

<span class="hljs-comment"># ...</span>
</code></pre>
<p><code>src/autogenerate.cmake</code>&#x4E2D;&#x5305;&#x542B;&#x4E86;&#x5176;&#x4ED6;&#x68C0;&#x6D4B;&#x5934;&#x6587;&#x4EF6;&#x3001;&#x51FD;&#x6570;&#x548C;&#x5E93;&#x7B49;&#x51E0;&#x4E2A;&#x51FD;&#x6570;:</p>
<pre><code class="lang-cmake"><span class="hljs-keyword">include</span>(CheckTypeSize)
<span class="hljs-keyword">include</span>(CheckFunctionExists)
<span class="hljs-keyword">include</span>(CheckIncludeFiles)
<span class="hljs-keyword">include</span>(CheckLibraryExists)
<span class="hljs-keyword">include</span>(CheckCSourceCompiles)

<span class="hljs-keyword">function</span>(generate_config_h)
    <span class="hljs-comment"># ... to be written</span>
<span class="hljs-keyword">endfunction</span>()

<span class="hljs-keyword">function</span>(generate_pathdef_c)
    <span class="hljs-comment"># ... to be written</span>
<span class="hljs-keyword">endfunction</span>()

<span class="hljs-keyword">function</span>(generate_osdef_h)
    <span class="hljs-comment"># ... to be written</span>
<span class="hljs-keyword">endfunction</span>()
</code></pre>
<p>&#x6211;&#x4EEC;&#x9009;&#x62E9;&#x4E86;&#x4E00;&#x4E9B;&#x7528;&#x4E8E;&#x751F;&#x6210;&#x6587;&#x4EF6;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7528;&#x5B8F;&#x6216;&#x201C;&#x88F8;&#x201D;CMake&#x4EE3;&#x7801;&#x3002;&#x5728;&#x524D;&#x51E0;&#x7AE0;&#x4E2D;&#x8BA8;&#x8BBA;&#x8FC7;&#x7684;&#xFF0C;&#x8FD9;&#x662F;&#x907F;&#x514D;&#x4E86;&#x4E00;&#x4E9B;&#x95EE;&#x9898;&#xFF1A;</p>
<ul>
<li>&#x907F;&#x514D;&#x591A;&#x6B21;&#x751F;&#x6210;&#x6587;&#x4EF6;&#xFF0C;&#x4EE5;&#x9632;&#x591A;&#x6B21;&#x5305;&#x542B;&#x6A21;&#x5757;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x5305;&#x542B;&#x4FDD;&#x62A4;&#x6765;&#x9632;&#x6B62;&#x610F;&#x5916;&#x5730;&#x591A;&#x6B21;&#x8FD0;&#x884C;&#x4EE3;&#x7801;&#x3002;</li>
<li>&#x4FDD;&#x8BC1;&#x4E86;&#x5BF9;&#x51FD;&#x6570;&#x4E2D;&#x53D8;&#x91CF;&#x8303;&#x56F4;&#x7684;&#x5B8C;&#x5168;&#x63A7;&#x5236;&#x3002;&#x8FD9;&#x907F;&#x514D;&#x4E86;&#x8FD9;&#x4E9B;&#x5B9A;&#x4E49;&#x6EA2;&#x51FA;&#xFF0C;&#x4ECE;&#x800C;&#x51FA;&#x73B0;&#x53D8;&#x91CF;&#x6C61;&#x67D3;&#x7684;&#x60C5;&#x51B5;&#x3002;</li>
</ul>
<h2 id="&#x6839;&#x636E;&#x7CFB;&#x7EDF;&#x914D;&#x7F6E;&#x9884;&#x5904;&#x7406;&#x5B8F;&#x5B9A;&#x4E49;">&#x6839;&#x636E;&#x7CFB;&#x7EDF;&#x914D;&#x7F6E;&#x9884;&#x5904;&#x7406;&#x5B8F;&#x5B9A;&#x4E49;</h2>
<p><code>config.h</code>&#x6587;&#x4EF6;&#x4EE5;<code>src/config.h.in</code>&#x4E3A;&#x76EE;&#x6807;&#x6240;&#x751F;&#x6210;&#x7684;&#xFF0C;&#x5176;&#x4E2D;&#x5305;&#x542B;&#x6839;&#x636E;&#x7CFB;&#x7EDF;&#x529F;&#x80FD;&#x914D;&#x7F6E;&#x7684;&#x9884;&#x5904;&#x7406;&#x6807;&#x5FD7;:</p>
<pre><code class="lang-c++"><span class="hljs-comment">/* Define if we have EBCDIC code */</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">undef</span> EBCDIC</span>

<span class="hljs-comment">/* Define unless no X support found */</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">undef</span> HAVE_X11</span>

<span class="hljs-comment">/* Define when terminfo support found */</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">undef</span> TERMINFO</span>

<span class="hljs-comment">/* Define when termcap.h contains ospeed */</span>

<span class="hljs-meta">#<span class="hljs-meta-keyword">undef</span> HAVE_OSPEED</span>
<span class="hljs-comment">/* ... */</span>
</code></pre>
<p>&#x751F;&#x6210;&#x7684;<code>src/config.h</code>&#x793A;&#x4F8B;&#x7C7B;&#x4F3C;&#x5982;&#x4E0B;&#x60C5;&#x51B5;(&#x5B9A;&#x4E49;&#x53EF;&#x4EE5;&#x6839;&#x636E;&#x73AF;&#x5883;&#x7684;&#x4E0D;&#x540C;&#x800C;&#x4E0D;&#x540C;):</p>
<pre><code class="lang-c++"><span class="hljs-comment">/* Define if we have EBCDIC code */</span>
<span class="hljs-comment">/* #undef EBCDIC */</span>

<span class="hljs-comment">/* Define unless no X support found */</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> HAVE_X11 1</span>

<span class="hljs-comment">/* Define when terminfo support found */</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> TERMINFO 1</span>

<span class="hljs-comment">/* Define when termcap.h contains ospeed */</span>

<span class="hljs-comment">/* #undef HAVE_OSPEED */</span>
<span class="hljs-comment">/* ... */</span>
</code></pre>
<p>&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x662F;&#x4E00;&#x4E2A;&#x5F88;&#x597D;&#x7684;&#x5E73;&#x53F0;&#x68C0;&#x67E5;&#x793A;&#x4F8B;: <a href="https://gitlab.kitware.com/cmake/community/wikis/doc/tutorials/How-To-Write-Platform-Checks" target="_blank">https://gitlab.kitware.com/cmake/community/wikis/doc/tutorials/How-To-Write-Platform-Checks</a></p>
<p>&#x5728;<code>src/configure.ac</code>&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x68C0;&#x67E5;&#x9700;&#x8981;&#x6267;&#x884C;&#x54EA;&#x4E9B;&#x5E73;&#x53F0;&#x68C0;&#x67E5;&#xFF0C;&#x4ECE;&#x800C;&#x6765;&#x8BBE;&#x7F6E;&#x76F8;&#x5E94;&#x7684;&#x9884;&#x5904;&#x7406;&#x5B9A;&#x4E49;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x5C06;&#x4F7F;&#x7528;<code>#cmakedefine</code>(<a href="https://cmake.org/cmake/help/v3.5/command/configure_file.html?highlight=cmakedefine" target="_blank">https://cmake.org/cmake/help/v3.5/command/configure_file.html?highlight=cmakedefine</a> )&#x4E3A;&#x4E86;&#x786E;&#x4FDD;&#x4E0D;&#x7834;&#x574F;&#x73B0;&#x6709;&#x7684;Autotools&#x6784;&#x5EFA;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;&#x590D;&#x5236;<code>config.h.in</code>&#x4E3A;<code>config.h.cmake.in</code>&#xFF0C;&#x5E76;&#x5C06;&#x6240;&#x6709;<code>#undef SOME_DEFINITION</code>&#x66F4;&#x6539;&#x4E3A;<code>#cmakedefine SOME_DEFINITION @SOME_DEFINITION@</code>&#x3002;</p>
<p>&#x5728;<code>generate_config_h</code>&#x51FD;&#x6570;&#x4E2D;&#xFF0C;&#x5148;&#x5B9A;&#x4E49;&#x4E24;&#x4E2A;&#x53D8;&#x91CF;&#xFF1A;</p>
<pre><code class="lang-cmake"><span class="hljs-keyword">set</span>(TERMINFO <span class="hljs-number">1</span>)
<span class="hljs-keyword">set</span>(UNIX <span class="hljs-number">1</span>)

<span class="hljs-comment"># this is hardcoded to keep the discussion in the book chapter</span>
<span class="hljs-comment"># which describes the migration to CMake simpler</span>
<span class="hljs-keyword">set</span>(TIME_WITH_SYS_TIME <span class="hljs-number">1</span>)
<span class="hljs-keyword">set</span>(RETSIGTYPE void)
<span class="hljs-keyword">set</span>(SIGRETURN <span class="hljs-keyword">return</span>)

<span class="hljs-keyword">find_package</span>(X11)
<span class="hljs-keyword">set</span>(HAVE_X11 <span class="hljs-variable">${X11_FOUND}</span>)
</code></pre>
<p>&#x7136;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x6267;&#x884C;&#x51E0;&#x4E2A;&#x7C7B;&#x578B;&#x68C0;&#x67E5;:</p>
<pre><code class="lang-cmake">check_type_size(<span class="hljs-string">&quot;int&quot;</span> VIM_SIZEOF_INT)
check_type_size(<span class="hljs-string">&quot;long&quot;</span> VIM_SIZEOF_LONG)
check_type_size(<span class="hljs-string">&quot;time_t&quot;</span> SIZEOF_TIME_T)
check_type_size(<span class="hljs-string">&quot;off_t&quot;</span> SIZEOF_OFF_T)
</code></pre>
<p>&#x7136;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5BF9;&#x51FD;&#x6570;&#x8FDB;&#x884C;&#x5FAA;&#x73AF;&#xFF0C;&#x68C0;&#x67E5;&#x7CFB;&#x7EDF;&#x662F;&#x5426;&#x80FD;&#x591F;&#x89E3;&#x6790;:</p>
<pre><code class="lang-cmake"><span class="hljs-keyword">foreach</span>(
  _function IN ITEMS
  fchdir fchown fchmod fsync getcwd getpseudotty
  getpwent getpwnam getpwuid getrlimit gettimeofday getwd lstat
  memset mkdtemp nanosleep opendir putenv qsort readlink select setenv
  getpgid setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction
  sigprocmask sigvec strcasecmp strerror strftime stricmp strncasecmp
  strnicmp strpbrk strtol towlower towupper iswupper
  usleep utime utimes mblen ftruncate
  )

  <span class="hljs-keyword">string</span>(TOUPPER <span class="hljs-string">&quot;${_function}&quot;</span> _function_uppercase)
  check_function_exists(<span class="hljs-variable">${_function}</span> HAVE_<span class="hljs-variable">${_function_uppercase}</span>)
<span class="hljs-keyword">endforeach</span>()
</code></pre>
<p>&#x9A8C;&#x8BC1;&#x5E93;&#x662F;&#x5426;&#x5305;&#x542B;&#x7279;&#x5B9A;&#x51FD;&#x6570;:</p>
<pre><code class="lang-cmake">check_library_exists(tinfo tgetent <span class="hljs-string">&quot;&quot;</span> HAVE_TGETENT)

<span class="hljs-keyword">if</span>(NOT HAVE_TGETENT)
    <span class="hljs-keyword">message</span>(FATAL_ERROR <span class="hljs-string">&quot;Could not find the tgetent() function. You need to install a terminal library; for example ncurses.&quot;</span>)
<span class="hljs-keyword">endif</span>()
</code></pre>
<p>&#x7136;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5FAA;&#x73AF;&#x5934;&#x6587;&#x4EF6;&#xFF0C;&#x68C0;&#x67E5;&#x5B83;&#x4EEC;&#x662F;&#x5426;&#x53EF;&#x7528;:</p>
<pre><code class="lang-cmake"><span class="hljs-keyword">foreach</span>(
  _header IN ITEMS
  setjmp.h dirent.h
  stdint.h stdlib.h <span class="hljs-keyword">string</span>.h
  sys/select.h sys/utsname.h termcap.h fcntl.h
  sgtty.h sys/ioctl.h sys/time.h sys/types.h
  termio.h iconv.h inttypes.h langinfo.h math.h
  unistd.h stropts.h errno.h sys/resource.h
  sys/systeminfo.h locale.h sys/stream.h termios.h
  libc.h sys/statfs.h poll.h sys/poll.h pwd.h
  utime.h sys/param.h libintl.h libgen.h
  util/debug.h util/msg18n.h frame.h sys/acl.h
  sys/access.h sys/sysinfo.h wchar.h wctype.h
  )

  <span class="hljs-keyword">string</span>(TOUPPER <span class="hljs-string">&quot;${_header}&quot;</span> _header_uppercase)
  <span class="hljs-keyword">string</span>(REPLACE <span class="hljs-string">&quot;/&quot;</span> <span class="hljs-string">&quot;_&quot;</span> _header_normalized <span class="hljs-string">&quot;${_header_uppercase}&quot;</span>)
  <span class="hljs-keyword">string</span>(REPLACE <span class="hljs-string">&quot;.&quot;</span> <span class="hljs-string">&quot;_&quot;</span> _header_normalized <span class="hljs-string">&quot;${_header_normalized}&quot;</span>)
  check_include_files(<span class="hljs-variable">${_header}</span> HAVE_<span class="hljs-variable">${_header_normalized}</span>)
<span class="hljs-keyword">endforeach</span>()
</code></pre>
<p>&#x7136;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x5C06;CMake&#x9009;&#x9879;&#x4ECE;&#x8F6C;&#x6362;&#x4E3A;&#x9884;&#x5904;&#x7406;&#x5B9A;&#x4E49;:</p>
<pre><code class="lang-cmake"><span class="hljs-keyword">string</span>(TOUPPER <span class="hljs-string">&quot;${FEATURES}&quot;</span> _features_upper)
<span class="hljs-keyword">set</span>(FEAT_<span class="hljs-variable">${_features_upper}</span> <span class="hljs-number">1</span>)

<span class="hljs-keyword">set</span>(FEAT_NETBEANS_INTG <span class="hljs-variable">${ENABLE_NETBEANS}</span>)
<span class="hljs-keyword">set</span>(FEAT_JOB_CHANNEL <span class="hljs-variable">${ENABLE_CHANNEL}</span>)
<span class="hljs-keyword">set</span>(FEAT_TERMINAL <span class="hljs-variable">${ENABLE_TERMINAL}</span>)
</code></pre>
<p>&#x6700;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x68C0;&#x67E5;&#x662F;&#x5426;&#x80FD;&#x591F;&#x7F16;&#x8BD1;&#x4E00;&#x4E2A;&#x7279;&#x5B9A;&#x7684;&#x4EE3;&#x7801;&#x7247;&#x6BB5;:</p>
<pre><code class="lang-cmake">check_c_source_compiles(
  &quot;
  #include &lt;sys/types.h&gt;
  #include &lt;sys/stat.h&gt;

  int
  main ()
  {
    struct stat st;
    int n;
    stat(\&quot;/\&quot;, &amp;st);
    n = (int)st.st_blksize;
    ;
    return 0;
  }
  &quot;
  HAVE_ST_BLKSIZE
  )
</code></pre>
<p>&#x7136;&#x540E;&#xFF0C;&#x4F7F;&#x7528;&#x5B9A;&#x4E49;&#x7684;&#x53D8;&#x91CF;&#x914D;&#x7F6E;<code>src/config.h.cmake.in</code>&#x751F;&#x6210;<code>config.h</code>&#xFF0C;&#x5176;&#x4E2D;&#x5305;&#x542B;<code>generate_config_h</code>&#x51FD;&#x6570;&#xFF1A;</p>
<pre><code class="lang-cmake"><span class="hljs-keyword">configure_file</span>(
  <span class="hljs-variable">${CMAKE_CURRENT_LIST_DIR}</span>/config.h.cmake.in
  <span class="hljs-variable">${CMAKE_CURRENT_BINARY_DIR}</span>/auto/config.h
  @ONLY
  )
</code></pre>
<h2 id="&#x4F7F;&#x7528;&#x8DEF;&#x5F84;&#x548C;&#x7F16;&#x8BD1;&#x5668;&#x6807;&#x5FD7;&#x914D;&#x7F6E;&#x6587;&#x4EF6;">&#x4F7F;&#x7528;&#x8DEF;&#x5F84;&#x548C;&#x7F16;&#x8BD1;&#x5668;&#x6807;&#x5FD7;&#x914D;&#x7F6E;&#x6587;&#x4EF6;</h2>
<p>&#x4ECE;<code>src/pathdef.c.in</code>&#x751F;&#x6210;<code>pathdef.c</code>:</p>
<pre><code class="lang-c++"><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-string">&quot;vim.h&quot;</span></span>

char_u *default_vim_dir = (char_u *)<span class="hljs-string">&quot;@_default_vim_dir@&quot;</span>;
char_u *default_vimruntime_dir = (char_u *)<span class="hljs-string">&quot;@_default_vimruntime_dir@&quot;</span>;
char_u *all_cflags = (char_u *)<span class="hljs-string">&quot;@_all_cflags@&quot;</span>;
char_u *all_lflags = (char_u *)<span class="hljs-string">&quot;@_all_lflags@&quot;</span>;
char_u *compiled_user = (char_u *)<span class="hljs-string">&quot;@_compiled_user@&quot;</span>;
char_u *compiled_sys = (char_u *)<span class="hljs-string">&quot;@_compiled_sys@&quot;</span>;
</code></pre>
<p><code>generate_pathdef_c</code>&#x51FD;&#x6570;&#x5728;<code>src/pathdef.c.in</code>&#x8FDB;&#x884C;&#x914D;&#x7F6E;&#x3002;&#x4E3A;&#x4E86;&#x7B80;&#x5355;&#x8D77;&#x89C1;&#xFF0C;&#x6211;&#x4EEC;&#x7701;&#x7565;&#x4E86;&#x94FE;&#x63A5;&#x6807;&#x5FD7;:</p>
<pre><code class="lang-cmake"><span class="hljs-keyword">function</span>(generate_pathdef_c)
  <span class="hljs-keyword">set</span>(_default_vim_dir <span class="hljs-variable">${CMAKE_INSTALL_PREFIX}</span>)
  <span class="hljs-keyword">set</span>(_default_vimruntime_dir <span class="hljs-variable">${_default_vim_dir}</span>)

  <span class="hljs-keyword">set</span>(_all_cflags <span class="hljs-string">&quot;${CMAKE_C_COMPILER} ${CMAKE_C_FLAGS}&quot;</span>)
  <span class="hljs-keyword">if</span>(CMAKE_BUILD_TYPE <span class="hljs-keyword">STREQUAL</span> <span class="hljs-string">&quot;Release&quot;</span>)
      <span class="hljs-keyword">set</span>(_all_cflags <span class="hljs-string">&quot;${_all_cflags} ${CMAKE_C_FLAGS_RELEASE}&quot;</span>)
  <span class="hljs-keyword">else</span>()
      <span class="hljs-keyword">set</span>(_all_cflags <span class="hljs-string">&quot;${_all_cflags} ${CMAKE_C_FLAGS_DEBUG}&quot;</span>)
  <span class="hljs-keyword">endif</span>()

  <span class="hljs-comment"># it would require a bit more work and execute commands at build time</span>
  <span class="hljs-comment"># to get the link line into the binary</span>
  <span class="hljs-keyword">set</span>(_all_lflags <span class="hljs-string">&quot;undefined&quot;</span>)

  <span class="hljs-keyword">if</span>(WIN32)
      <span class="hljs-keyword">set</span>(_compiled_user $ENV{USERNAME})
  <span class="hljs-keyword">else</span>()
      <span class="hljs-keyword">set</span>(_compiled_user $ENV{USER})
  <span class="hljs-keyword">endif</span>()

  cmake_host_system_information(RESULT _compiled_sys QUERY HOSTNAME)

  <span class="hljs-keyword">configure_file</span>(
    <span class="hljs-variable">${CMAKE_CURRENT_LIST_DIR}</span>/pathdef.c.in
    <span class="hljs-variable">${CMAKE_CURRENT_BINARY_DIR}</span>/auto/pathdef.c
    @ONLY
    )
<span class="hljs-keyword">endfunction</span>()
</code></pre>
<h2 id="&#x914D;&#x7F6E;&#x65F6;&#x6267;&#x884C;shell&#x811A;&#x672C;">&#x914D;&#x7F6E;&#x65F6;&#x6267;&#x884C;shell&#x811A;&#x672C;</h2>
<p>&#x6700;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x51FD;&#x6570;&#x751F;&#x6210;<code>osdef.h</code>:</p>
<pre><code class="lang-cmake"><span class="hljs-keyword">function</span>(generate_osdef_h)
  <span class="hljs-keyword">find_program</span>(BASH_EXECUTABLE bash)

  <span class="hljs-keyword">execute_process</span>(
    COMMAND
    <span class="hljs-variable">${BASH_EXECUTABLE}</span> osdef.sh <span class="hljs-variable">${CMAKE_CURRENT_BINARY_DIR}</span>
    WORKING_DIRECTORY
    <span class="hljs-variable">${CMAKE_CURRENT_LIST_DIR}</span>
    )
<span class="hljs-keyword">endfunction</span>()
</code></pre>
<p>&#x4E3A;&#x4E86;&#x5728;<code>${CMAKE_CURRENT_BINARY_DIR}/src/auto</code>&#x800C;&#x4E0D;&#x662F;<code>src/auto</code>&#x4E2D;&#x751F;&#x6210;<code>osdef.h</code>&#xFF0C;&#x6211;&#x4EEC;&#x5FC5;&#x987B;&#x8C03;&#x6574;<code>osdef.sh</code>&#x4EE5;&#x63A5;&#x53D7;<code>${CMAKE_CURRENT_BINARY_DIR}</code>&#x4F5C;&#x4E3A;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;&#x3002;</p>
<p><code>osdef.sh</code>&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x68C0;&#x67E5;&#x662F;&#x5426;&#x7ED9;&#x5B9A;&#x4E86;&#x8FD9;&#x4E2A;&#x53C2;&#x6570;:</p>
<pre><code class="lang-shell">if [ $# -eq 0 ]
then
  # there are no arguments
  # assume the target directory is current directory
  target_directory=$PWD
else
  # target directory is provided as argument
  target_directory=$1
fi
</code></pre>
<p>&#x7136;&#x540E;&#xFF0C;&#x751F;&#x6210;<code>${target_directory}/auto/osdef.h</code>&#x3002;&#x4E3A;&#x6B64;&#xFF0C;&#x6211;&#x4EEC;&#x8FD8;&#x5FC5;&#x987B;&#x5728;<code>osdef.sh</code>&#x4E2D;&#x8C03;&#x6574;&#x4EE5;&#x4E0B;&#x884C;:</p>
<pre><code class="lang-shell">$CC -I. -I$srcdir -
I${target_directory} -E osdef0.c &gt;osdef0.cc
</code></pre>

                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="15.1-chinese.html" class="navigation navigation-prev " aria-label="Previous page: 15.1 如何开始迁移项目">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="15.3-chinese.html" class="navigation navigation-next " aria-label="Next page: 15.3 检测所需的链接和依赖关系">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"15.2 生成文件并编写平台检查","level":"1.18.2","depth":2,"next":{"title":"15.3 检测所需的链接和依赖关系","level":"1.18.3","depth":2,"path":"content/chapter15/15.3-chinese.md","ref":"content/chapter15/15.3-chinese.md","articles":[]},"previous":{"title":"15.1 如何开始迁移项目","level":"1.18.1","depth":2,"path":"content/chapter15/15.1-chinese.md","ref":"content/chapter15/15.1-chinese.md","articles":[]},"dir":"ltr"},"config":{"plugins":["-lunr","-search","search-pro","-sharing","github","pageview-count"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"github":{"url":"https://github.com/arcticfox1919"},"search-pro":{},"pageview-count":{},"highlight":{},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"陈晓伟 chenxiaowei","pdf":{"pageNumbers":false,"fontSize":30,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":30,"left":30,"top":30,"bottom":50}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"《CMake Cookbook》中文版","language":"zh-hans","gitbook":"*","description":"作为对《CMake Cookbook》英文版的中文翻译。","direction":"ltr"},"file":{"path":"content/chapter15/15.2-chinese.md","mtime":"2020-09-22T10:39:01.917Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-09-22T11:21:21.825Z"},"basePath":"../..","book":{"language":""}});
        });
    </script>
</div>

        
    <script src="../../gitbook/gitbook.js"></script>
    <script src="../../gitbook/theme.js"></script>
    
        
        <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-github/plugin.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-pageview-count/plugin.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    

    </body>
</html>

